接下來 30 天,我想帶你把一個東西從頭拆到尾:Agent Portal,一套銀行的企業 AI 助理平台的對外入口。不是貼程式碼那種拆法,是一天拆一個設計決定,講清楚為什麼這樣選、代價是什麼,慢慢拼成一張完整的圖。今天是開場,先不上路,先給地圖——告訴你這 30 天會經過哪些站、你這種背景的讀者該在哪幾站多停一會兒。
本篇結構:
概括地說:Portal 是整套平台的對外入口,它自己不產生答案,只做四件橫切的事——身分、安全、路由、整合。
這句話聽起來平淡,但它其實是後面 29 天所有設計的源頭。行員每問一個問題,請求都先進到 Portal,而 Portal 對每個請求做的就是這四件事:
| 橫切職責 | Portal 做什麼 |
|---|---|
| 身分 | 確認你是誰 |
| 安全 | 檢查你輸入的內容有沒有夾帶惡意指令或個資 |
| 路由 | 判斷這題該交給誰回答 |
| 整合 | 把答案組好、附上來源再回給你,最後留一筆稽核 |
真正的業務知識不在它身上——那些在後端的 AI 引擎(後面都稱它 Engine)和知識庫(KM)裡。Portal 不存資料庫、不記對話歷史,它的價值就是把「進門到出門」這條路管得又穩又安全。
換個比喻:它是一棟大樓的警衛兼總機。
| 角色動作 | 對應的橫切職責 |
|---|---|
| 驗證件 | 身分 |
| 安檢包包 | 安全 |
| 告訴你該去幾樓找誰 | 路由 |
| 必要時幫你把幾個部門的回覆湊在一起 | 整合 |
但大樓裡的業務,警衛一概不懂、也不該懂。整個系列我會反覆回到這句話——遇到「這功能該不該放 Portal」的猶豫時,答案幾乎都是「看它是不是這四件事之一」。
你可能會想,一個閘道有什麼好講 30 天的。問題在於,這個入口同時要扛幾件彼此拉扯的事,而每一件單獨看都不難、湊在一起就全是取捨。
| 它要扛的事 | 逼出來的設計 |
|---|---|
| 撐高並行,但自己幾乎不做運算,時間都花在等後端、等 LLM 回覆 | reactive 的非阻塞執行模型,以及「主線絕不能卡」這條會貫穿全系列的鐵律 |
| 在不信任前端的前提下確立「你是誰」,又得在身分服務掛掉時決定該放行還是擋下 | fail-open 與 fail-closed 的不對稱 |
| 同時容納好幾家 LLM、好幾套守門機制,還得做到「換廠商一行 Java 都不動」 | 依賴反轉與策略模式的實戰 |
| 在金融場景下擋住個資外洩和提示注入,而且不能只擋一層 | 縱深防禦 |
這些主題不是各自獨立的章節,是一條因果鏈:
reactive,所以上下文不能用 ThreadLocal(Java 裡把資料綁在執行緒上的慣用手法)傳;這 30 天不是每一站都對每個人同等重要,先說好閱讀路線,你才知道自己能略過哪裡、該慢下來在哪裡。
| 你的背景 | 建議的閱讀重點 |
|---|---|
後端工程師、對 reactive 不熟 |
第二章(Day 5–7)是地基,後面每提到「不阻塞」「offload」「上下文怎麼跟著請求走」都會回頭引用它,別跳 |
| 關心 AI 系統的安全與合規 | 第五章(Day 16–20)最厚,五天講提示注入、PII 遮罩、縱深防禦、出境守門和越權防護,是整個系列的重頭戲 |
| 在做平台、想學「怎麼設計一個可抽換的整合層」 | 第四章(Day 12–15)的依賴反轉與插件框架,加上第八章的 MCP 軌,是你的主菜 |
| 只想建立心智模型、不打算深究實作 | 看完第一章四天就夠了,後面挑感興趣的章節點進來即可 |
也先講清楚一條誠實分界,免得你期待落空:系列裡會出現「已上線」和「規劃中」兩種狀態,我會逐一標明。例如第八章會談到的 Agent 自主行動安全層——工具結果檢查、步數限制、工具政策這類防線大多已上線生效,少數(如完整計畫驗證)還沒接進對話流程;哪些已接、哪些未接,到第八章會逐一攤開。
金融系統談安全,把藍圖講成現況是大忌,我會老實說哪些是真的、哪些是規劃。
另外,文章裡用到的具體例子,會圍繞一位行員「小林」展開,他輸入:
我的員編是 123456,AD 帳號被鎖了,順便想查內湖分行的營業時間。
這句話同時踩到身分、個資、IT 意圖和地點意圖,正好能當身分/守門/路由/檢索/稽核這幾章的貫穿例子,你會在後面反覆看到它。
還有一個輕鬆的比喻,這 30 天我會不時拿出來用:把整套平台想成一座忍者村——Portal 是村口的關卡兼行政中樞(換句話說,就是前面那個警衛兼總機的忍者版),後端的 Engine、KM 是各司其職的忍者,每個請求是進出村子辦任務的人,資源預算則是有限的查克拉。碰到比較抽象的觀念時,我會順手把它翻成這個世界的畫面,偶爾也借別部作品來比喻;這只是幫你把硬觀念記牢的掛勾,跳過不看也不影響正文。
明天 Day 2,我們把鏡頭拉遠一格,看 Portal 在整個系統裡站在哪個位置、為什麼它需要獨立成一層,而不是塞進後端引擎裡。